﻿namespace LM.Negocio.Validadores
{
    using LM.InterfacesFabricas.Interfaces.Repositorios;
    using System;
    using System.Linq;
    using LM.Negocio.Objetos;

    public class ValidadorDeMarca : ValidadorAbastrato
    {
        private Marca _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Marca> _repositorioDeMarca;

        public ValidadorDeMarca(IRepositorioDeConsultaDeObjetos<Marca> repositorioDeMarca)
        {
            if (repositorioDeMarca == null)
            {
                throw new ArgumentNullException("repositorioDeMarca");
            }

            _repositorioDeMarca = repositorioDeMarca;
        }

        public void ValideCadastro(Marca marca)
        {
            if (marca == null)
            {
                throw new ArgumentException("marca");
            }

            _objetoValidado = marca;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideDescricaoNaoInformada();
            ValideMarcaJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao(Marca marca)
        {
            if (marca == null)
            {
                throw new ArgumentException("marca");
            }

            _objetoValidado = marca;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideDescricaoNaoInformada();
            ValideMarcaNaoCadastrada();

            base.GarantaSucesso();
        }

        public void ValideExclusao(Marca marca)
        {
            if (marca == null)
            {
                throw new ArgumentException("marca");
            }

            _objetoValidado = marca;
            base.LimpeInconsistencias();

            ValideMarcaNaoCadastrada();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if (_objetoValidado.Codigo == 0)
            {
                AdicioneInconsistencia("Código não informado.");
            }
        }

        private void ValideDescricaoNaoInformada()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Descricao))
            {
                AdicioneInconsistencia("Descrição não informada.");
            }
        }

        private bool MarcaJaCadastrada()
        {
            return _repositorioDeMarca.Consulte(m => m.Codigo == _objetoValidado.Codigo).Any();
        }

        private void ValideMarcaJaCadastrada()
        {
            if (MarcaJaCadastrada())
            {
                AdicioneInconsistencia("Já existe uma Marca cadastrada com o código {0}.", _objetoValidado.Codigo);
            }
        }

        private void ValideMarcaNaoCadastrada()
        {
            if (!MarcaJaCadastrada())
            {
                AdicioneInconsistencia("Marca com o código {0} não cadastrada.", _objetoValidado.Codigo);
            }
        }
    }
}
